//
// Created by Yurzi on 2021/3/21.
//

#ifndef CEDUGROUPWORK_LISTOPERATIONS_H
#define CEDUGROUPWORK_LISTOPERATIONS_H

#include "FileOperations.h"
#include "UI.h"
#include <windows.h>
#include <string.h>
#include "DataTypes.h"


double **init2DMatrix(int line,int row);//创建二维矩阵
void free2DMatrix(double **head,int line);//释放二维矩阵
int logDate_Length(BinaryPair *head);//计算统计链表长度
BinaryPair* material_amount_day(int num,LogNode*r);//根据原料id来在Log进行操作，返回rear节点，rear节点的值最大，代表最早的日期（通过prv遍历）
//（r传入为尾节点）

Material *initMtList(FILE *mtFilePtr);//建立原材料链表
Kind * initKindList(FILE *kindFilePtr);//建立类链表
Tag *initTagList(FILE *tagFilePtr);//建立标签链表
Good* initGoodList(FILE *goodFilePtr);//建立商品链表
Kind * initGoodTree(Good *goodList,Kind *kindList);//建立商品树


void delete_UI();//删除函数界面
void delete_kind(Kind* h);//删除商品种类函数（流程函数）
void delete_good(Good* h);//具体货物的删除（流程函数）
void delete_material(Material* h);//删除原料的函数（流程函数）
void delete_tag(Tag* h);//删除标签的函数(流程函数)
void delete_kindid_minus(Kind* h);//下标id修改函数1(种类下标)
void delete_tagid_minus(Tag* h);//下标id修改函数2(标签下标)
void delete_materialid_minus(Material* h);//下标id修改函数3(原料下标)
void free_rebuild();//释放和重建商品树

void del_car();//删除最后一个购物车
Car* add_car(Good*);//增加购物车
void Dele_Car(int num);//删除购物车
Material* copymatList(Material* head);//复制原材料链表
Car* find_car(int num);//寻找购物车节点
void free_Car(void);//释放购物车

int judge_kindname(Kind* h, char* name);//(链表中)种类名称查重，有重为0
int judge_goodname(Good* h, char* name);//（链表中）货物名称查重，有重为0
int judge_tagname(Tag* h, char* name);//（链表中）标签名称查重，有重为0
int judge_goodtag(Good* h, char* name);//（商品中）标签名称查重，有重为0
int judge_goodmt(Good* h, char* name);//（商品中）原料名称查重，有重为0
int judge_tagmt(Tag* h, char* name);//（标签中）原料名称查重，有重为0
int judge_mtname(Material* h, char* name);//（链表中）原料名称查重，有重为0
int judge_kindid(Kind *h,int num);//(链表中)种类id的查重，有重为0

int judge_tagname_id(Tag* h, int num);//（链表中）标签id查重，有重为0
int judge_mtname_id(Material* h, int num);//（链表中）原料id查重，有重为0
int judge_goodtag_id(Good* h, int num);//（商品中）标签id查重，有重为0
int judge_goodmt_id(Good* h, int num);//（商品中）原料id查重，有重为0
int judge_tagmt_id(Tag* h, int num);//（标签中）原料id查重，有重为0
double getsnum();//将字符串中的浮点数字找出返回
void free_data();//释放二元对


int printf_good_specific(Good* h, int n);//商品中某一信息的打印（通过n的值来选择）
int printf_tag_specific(Tag* h, int n);//标签中某一信息的打印（通过n的值来选择）
void printf_mt_specific(Material* h, int n);//原料中某一信息的打印（通过n的值来选择）

void tag_addto_good(Tag* h, Good* g) ;//标签选择添加（对象为商品）
void material_addto_good(Material* h, Good* g);//原料的选择添加（对象为商品）
void material_addto_tag(Material* h, Tag* g) ;//原料选择添加（对象为标签）
void relife_good(Good*p);//初始化商品中的数组
void relife_tag(Tag*p);//初始化标签中的数组


void create_histoty(Car*h,LogNode*p);//传入购物车指针，将购物车中的商品记录
void free_loglist(LogNode*h);//释放记录链表


double cost_mt_tag(Tag *p);//计算标签的参考价格（根据原料）
double cost_mt_good(Good *p);//计算商品的参考价格（根据原料）
double cost_tag_good(Good *p);//计算商品的参考价格(根据标签)



Good* build_goodlist(Kind* root);//从商品树上面弄下来的商品链表的创立（无哨兵）；

void rebuild_good();    //刷新并重建商品链表
void rebuild_kind();    //刷新并重建类型链表
void rebuild_tag();      //刷新并重建标签链表
void rebuild_mt();      //刷新并重建原料链表

void rank_list(Good* h);//商品链表关于id排序；
void rank_material(Material* h);//原材料链表关于id排序;
void rank_tags(Tag* h);//标签链表关于id排序；
void rank_kind(Kind* h);//种类链表关于id排序;


void free_good(Good* h);//释放货物链表；
void free_tags(Tag* h);//释放标签链表
void free_material(Material* h);//释放原料链表；
void free_kind(Kind* h);//释放种类链表；



void produce_goodid(Good* h0, Good* p0);//商品id的生成；
void produce_kindid(Kind* h0, Kind* p0);//类id的生成；
void produce_tagid(Tag* h0, Tag* p0);//标签id的生成；
void produce_materialid(Material* h0, Material* p0);//原料id的生成；



void alter_good(Good* h);//修改商品的函数(传入商品链表头节点)该函数为总的流程函数
void alter_tag(Tag* h);//修改标签（流程函数）
void alter_mt(Material* h);//修改原料的函数（流程函数）


void alter_goodprice(Good* h, double money);//修改具体某商品的价格函数
void alter_goodice(Good* h, int judge);//修改具体某商品的加冰情况函数
void alter_goodhot(Good* h, int judge);//修改具体某商品的加热情况函数

void add_goodtag(Good* h, char* tagname);//增加具体某商品的标签的函数
void delete_goodtag(Good* h, char* tagname);//删除具体某商品的标签的函数

void add_good_ice(Good *p,int num);//增加商品时给商品加冰的函数
void add_good_hot(Good *p,int num);//增加商品时给商品加热的函数

void add_goodmt(Good* h, char* mtname);//增加具体某商品原料的函数


void delete_goodmt(Good* h,int id);//删除具体某商品原料的函数
void delete_good_depenon_kind(Good*h,int id);//删除某类别后将商品链表进行调整的函数


void delete_good_name(Good* h, char* name);//删除某商品的函数（根据名称）
void delete_good_ptr(Good *target);//删除商品的函数（根据指针）

void delete_mt(Material *_mtList,Material* target);//删除某原料的函数(根据指针)

void delete_tag_name(Tag* h, char* name);//删除某标签的函数(根据名称)
void delete_tag_ptr(Tag *target);//删除某标签的函数（根据指针）


void delete_kind_name(Kind* h, char* name);//删除某类别的函数（根据名称）


void alter_mtprice(Material* h, double money);//修改原料的价格属性的函数
void alter_mtamount(Material* h, int num);//修改原料的存储量属性的函数


void alter_tagprice(Tag* h, double money);//修改标签的价格属性的函数
void add_tagmt(Tag* h, char* mtname);//增加具体某标签原料的函数
void delete_tagmt(Tag* h, char* mtname);//删除具体某标签原料的函数(根据名称)


Good* address_good(Good* h, char* name);//用名称定位商品的地址
Tag* address_tag(Tag* h, char* name);//用名称定位标签的地址
Tag* address_tag_id(Tag* h, int num);//用id定位标签的地址

Material* address_mt_id(Material* h, int num);//用名称定位原料的地址
Good* address_good_id(Good* h, int num);//根据id来找商品
Kind* address_kind(Kind* h, char* name);//用名称定位种类的地址(传入种类链表头节点)
Material* address_mt(Material* h, char* name);//用名称定位原料的地址

Good* FindGoodById(int id);//根据id找到商品
Kind* FindKindById(int id);//根据id找到类


void de_tag_refresh_good(int id, Good* h);//在删除后，刷新商品链表里面的标签
void de_mt_refresh_good(int id, Good* h);//在删除后，刷新商品链表里面的原料
void de_mt_refresh_tag(int id, Tag* h);//在删除后，刷新标签链表里面的原料
void change_tag_refresh_good(Tag*p, Good* h);//在修改后，刷新商品链表里面的标签
void change_mt_refresh_good(Material*p, Good* h);//在修改后，刷新商品链表里面的原料
void change_mt_refresh_tag(Material*p, Tag* h);//在修改后，刷新标签链表里面的原料

void free_goodTree(Kind* h);//释放商品树
void free_rebuild_goodtree();//释放和重建商品树


void scanf_ss(int n,TCHAR *name);//名称的字符输入监控

//书相关
GoodPage *initGoodBook(Good *_goodList);    //构建商品书
KindPage *initKindBook(Kind *_kindList);    //构建类书
TagPage *initTagBook(Tag *_tagList);    //构建标签书
MTPage *initMTBook(Material *_mtList);  //构建原料书
LogPage *initLogBook(LogNode *_Log_rear);//构建历史书
//释放书
void free_goodBook(GoodPage* h);    //释放商品书
void free_kindBook(KindPage* h);    //释放类书
void free_MTBook(MTPage* h);    //释放原料书
void free_TagBook(TagPage* h);  //释放标签书
void free_LogBook(LogPage* h);  //释放历史书

//刷新书
void refresh_goodBook();    //刷新商品书
void refresh_kindBook();    //刷新类书
void refresh_MTBook();  //刷新原料书
void refresh_TagBook(); //刷新标签书
void refresh_LogBook(); //刷新历史书

//模糊搜索
Good* fuzzy_search(Good* item, char* input);
//模糊搜索翻页
GoodPage *builtGoodBook(Good *_goodList);
//计算相同字符个数
int weight(char* input, char* good);
#endif //CEDUGROUPWORK_LISTOPERATIONS_H
